Skip to content

🌱 Update boxcutter integration and add cross-CE collision regression test#2764

Open
perdasilva wants to merge 8 commits into
operator-framework:mainfrom
perdasilva:update-boxcutter-sibling-owners
Open

🌱 Update boxcutter integration and add cross-CE collision regression test#2764
perdasilva wants to merge 8 commits into
operator-framework:mainfrom
perdasilva:update-boxcutter-sibling-owners

Conversation

@perdasilva

@perdasilva perdasilva commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Description

Adapt the ClusterObjectSet controller to boxcutter v0.14.0's API changes (WithPreviousOwners replaces WithSiblingOwners) and add an e2e regression test for cross-ClusterExtension collision protection.

Changes

  • listPreviousRevisions — returns active revisions belonging to the same ClusterExtension with lower revision numbers. Filters out self, archived, deleting, and equal-or-higher revisions.
  • buildBoxcutterPhases — calls listPreviousRevisions + WithPreviousOwners.
  • NewObjectEngine — passes the new required managedBy parameter, set to FieldOwnerPrefix ("olm.operatorframework.io").
  • Dependency bumps — boxcutter v0.13.1 → v0.14.0, plus transitive updates.
  • Unit tests — straightforward table-driven test for listPreviousRevisions.
  • E2e regression test — verifies that a second ClusterExtension targeting an already-installed bundle cannot take over resources from the original owner, even with a higher-revision ClusterObjectSet. This is existing boxcutter behavior; the test confirms it still works after the API change.

Reviewer Checklist

  • API Go Documentation
  • Tests: Unit Tests (and E2E Tests, if appropriate)
  • Comprehensive Commit Messages
  • Links to related GitHub Issue(s)

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings June 12, 2026 11:41
@netlify

netlify Bot commented Jun 12, 2026

Copy link
Copy Markdown

Deploy Preview for olmv1 ready!

Name Link
🔨 Latest commit 73cfe87
🔍 Latest deploy log https://app.netlify.com/projects/olmv1/deploys/6a3bc71ff361070008ecf4da
😎 Deploy Preview https://deploy-preview-2764--olmv1.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch 2 times, most recently from ddb7a76 to fe0acea Compare June 12, 2026 11:43

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the operator-controller’s Boxcutter integration to treat all active sibling ClusterObjectSet revisions (both lower and higher revision numbers) as relevant “owners”, aiming to avoid false-positive collision reporting during revision handover. It also adds coverage to validate collision behavior when a conflicting ClusterExtension is upgraded.

Changes:

  • Switch Boxcutter ownership inputs from “previous revisions only” to “all active sibling revisions” and add unit tests for the sibling listing logic.
  • Add an e2e scenario asserting collisions persist even when a conflicting ClusterExtension upgrades to a different version.
  • Update Go module dependencies for Boxcutter (and related transitive deps).

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
test/e2e/features/update.feature Adds an e2e scenario for collision persistence across upgrades (but needs step/param fixes).
internal/operator-controller/controllers/revision_engine_factory.go Adjusts Boxcutter object engine factory invocation to match updated dependency API.
internal/operator-controller/controllers/clusterobjectset_controller.go Introduces sibling revision listing and feeds sibling owners into Boxcutter.
internal/operator-controller/controllers/clusterobjectset_controller_internal_test.go Adds unit tests for listSiblingRevisions.
go.mod Bumps Boxcutter + deps, but currently includes merge-conflict markers and an invalid local replace.
go.sum Updates dependency sums, but currently includes multiple unresolved merge-conflict blocks.
Comments suppressed due to low confidence (2)

go.mod:7

  • go.mod still contains unresolved merge-conflict markers (<<<<<<< / ======= / >>>>>>>). This makes the module file invalid and will break go tooling in CI. Resolve the conflict by choosing a single go directive line and removing all conflict markers, then re-run go mod tidy to ensure go.sum is consistent.
go 1.26.3

require (
	github.com/BurntSushi/toml v1.6.0
	github.com/Masterminds/semver/v3 v3.5.0

go.mod:329

  • This replace points to a developer-local filesystem path, which will not exist in CI and will break module resolution for anyone else. Repository go.mod files should not contain machine-specific local replaces; rely on the tagged boxcutter version instead.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch from fe0acea to ceb6fee Compare June 12, 2026 11:52
Copilot AI review requested due to automatic review settings June 12, 2026 11:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated 2 comments.

Comment thread internal/operator-controller/controllers/revision_engine_factory.go
Comment thread go.mod Outdated
@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch 3 times, most recently from d81b767 to 507f415 Compare June 12, 2026 12:23
@perdasilva perdasilva changed the title 🌱 Update boxcutter sibling owners 🌱 Update boxcutter integration for sibling owners API Jun 12, 2026
@codecov

codecov Bot commented Jun 12, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.73684% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 70.42%. Comparing base (7d6a00d) to head (73cfe87).

Files with missing lines Patch % Lines
...troller/controllers/clusterobjectset_controller.go 93.75% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main    #2764   +/-   ##
=======================================
  Coverage   70.42%   70.42%           
=======================================
  Files         143      143           
  Lines       10617    10625    +8     
=======================================
+ Hits         7477     7483    +6     
- Misses       2579     2580    +1     
- Partials      561      562    +1     
Flag Coverage Δ
e2e 35.09% <0.00%> (-0.03%) ⬇️
experimental-e2e 52.61% <94.73%> (+0.24%) ⬆️
unit 59.51% <78.94%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@pedjak pedjak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question (non-blocking): The Copilot review on an earlier push mentioned an e2e .feature file change for collision persistence across upgrades, but it's absent from the current diff. Is that planned as a follow-up PR? The unit tests cover listSiblingRevisions well, but an e2e test exercising the higher-sibling handover path would add confidence that the behavioral change works end-to-end.

Copilot AI review requested due to automatic review settings June 15, 2026 07:33
@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch from 507f415 to 1dea3d1 Compare June 15, 2026 07:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated no new comments.

@pedjak pedjak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review focused on boxcutter library update and coding style.

@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch 2 times, most recently from 1c88b5a to c490544 Compare June 17, 2026 07:31
Copilot AI review requested due to automatic review settings June 18, 2026 07:24
@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch from c490544 to c3a323b Compare June 18, 2026 07:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings June 23, 2026 08:05
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label Jun 23, 2026
@openshift-ci

openshift-ci Bot commented Jun 23, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please ask for approval from pedjak. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated 1 comment.

Comment thread internal/operator-controller/controllers/revision_engine_factory.go
@pedjak

pedjak commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jun 23, 2026
…bjectSet

Verify that a conflicting ClusterExtension with a higher-revision
ClusterObjectSet does not take over resources owned by the original
ClusterExtension.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label Jun 23, 2026
@openshift-ci

openshift-ci Bot commented Jun 23, 2026

Copy link
Copy Markdown

New changes are detected. LGTM label has been removed.

@pedjak pedjak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review focused on test structure (unit + e2e) and a minor code comment placement nit.

Comment thread test/e2e/features/install.feature Outdated
Then ClusterExtension is available
And ClusterExtension reports Progressing as True with Reason Succeeded
And ClusterExtension reports Installed as True

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: This scenario has three When-Then cycles (install first CE → assert available, apply dup CE → assert collision, update first CE → assert still colliding). Multiple When-Then blocks in a single Gherkin scenario is generally considered an anti-pattern — each scenario should specify one behavior, not a multi-step integration script.

Having multiple transitions makes it harder to diagnose which step failed and why, and the scenario title ("does not take over resources") only describes the final assertion.

Consider splitting into two scenarios:

  1. Conflicting CE gets collision on install
  2. Conflicting CE with higher revision still gets collision after update

They could share setup via a Background or a reusable Given step.

Also, this scenario involves updating the CE spec (adding DeploymentConfig) and asserting behavior after the update. That makes it a better fit for update.feature than install.feature. The earlier Copilot review also referenced this being in update.feature — was there a reason to move it here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved the test to update.feature — agreed it fits better there.

On splitting: the "conflicting CE gets collision on install" case is already covered by the scenario right above ("Detect collision when a second ClusterExtension installs the same package after an upgrade"). The value of this scenario is the multi-step sequence: initial collision → spec change producing a higher-revision COS → still collision. Splitting would duplicate the first half of the existing test without adding coverage.

Also added assertions that the original CE remains Installed=True after both collision points, which was missing before.

require.NoError(t, ocv1.AddToScheme(testScheme))

type methodUnderTest struct {
name string

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: The double loop (test cases × methods) with a map[string][]string for expected results works, but it obscures the arrange-act-assert structure. A reader has to mentally cross-reference the map key with the method definition at the top to understand what any single test case asserts.

An alternative structure that would be clearer:

  • Test listOtherActiveRevisions directly with explicit predicates (the real unit under test). This covers the shared filtering logic once.
  • Add a couple of trivial tests for listSiblingRevisions and listPreviousRevisions that just verify they delegate with the correct predicate (e.g., one passes all, the other filters by revision number).

This separates "does the shared logic work" from "do the wrappers delegate correctly" and makes each test read as a clean given-when-then.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is addressed — listOtherActiveRevisions and listSiblingRevisions have been removed. The current code only has listPreviousRevisions with a simple single-loop table-driven test. No more double loop or map cross-referencing.


require.ElementsMatch(t, tc.expectedRevs, names)
})
for _, m := range methods {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: The name format fmt.Sprintf("%s/%s", m.name, tc.name) puts the method name first, but the outer loop iterates over test cases. This means Go test output interleaves methods:

listSiblingRevisions/should exclude self...
listPreviousRevisions/should exclude self...
listSiblingRevisions/should exclude archived...
listPreviousRevisions/should exclude archived...

Swapping to tc.name/m.name (or swapping the loop order) would group output by method, making it easier to scan all cases for one method when debugging a failure.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also addressed — the double loop is gone entirely. Single loop over test cases calling listPreviousRevisions directly.

rev1 := newTestClusterObjectSetInternal(t, "rev-1")
rev1.Finalizers = []string{"test-finalizer"}
rev1.DeletionTimestamp = &metav1.Time{Time: time.Now()}
rev2 := newTestClusterObjectSetInternal(t, "rev-2")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: The old test marked rev-2 (middle revision) as deleting with currentRev: "rev-3", which tested the case where a middle revision is deleting while both lower and higher revisions exist. The new test moves the deletion to rev-1 (lowest revision). Both validate the "skip deleting" filter, but the old arrangement was a more interesting interleaving — it verified that a deleting revision between two active ones is correctly excluded regardless of its position.

Consider keeping deletion on rev-2 and adjusting the expected results accordingly, or adding a second sub-case for middle-revision deletion.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed — deletion is back on rev-2 (middle revision) with currentRev: "rev-3", matching the original arrangement.

return nil
}

// listSiblingRevisions returns all active revisions belonging to the same ClusterExtension, excluding the current one.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: The godoc here explains why boxcutter needs siblings (avoiding false collisions during handover). That is caller context — it belongs at the call site in buildBoxcutterPhases where WithSiblingOwners is passed. The method itself just returns "all active non-self revisions for the same owner," which is already clear from its name and signature.

Keeping method-level docs focused on what the method does (not why a specific caller needs it) prevents the comment from becoming stale if another caller is added.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed — listSiblingRevisions and WithSiblingOwners are gone. The remaining listPreviousRevisions godoc only describes what the method does, no caller context.

Comment thread test/e2e/features/install.feature Outdated
And ClusterExtension reports Progressing as True with Reason Retrying and Message includes:
"""
revision object collisions
"""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: The scenario asserts that the dup CE shows collision and that the higher revision still shows collision after update. But it doesn't verify that the original ${NAME} CE remains Available/Installed throughout the conflict. Adding something like And ClusterExtension "${NAME}" reports Installed as True after the dup's collision assertion would strengthen the test — confirming the original owner is unaffected is arguably the most important property to verify here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed — added ClusterExtension "ce-${SCENARIO_ID}" reports Installed as True after both collision points (initial collision and post-update higher-revision collision).

…riginal CE stays installed

- Move the higher-revision collision test from install.feature to
  update.feature where it fits better alongside the existing collision
  scenario.
- Add assertions that the original ClusterExtension remains Installed=True
  after both collision points.
- Add NamedClusterExtensionReportsCondition and
  ClusterExtensionHasClusterObjectSets step definitions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 24, 2026 08:57

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 2 comments.

Comment thread internal/operator-controller/controllers/revision_engine_factory.go
The test now lives in update.feature only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread test/e2e/features/update.feature Outdated
"""
And ClusterExtension is rolled out
And ClusterExtension is available
And ClusterExtension "${NAME}" has 1 ClusterObjectSet

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

perhaps: owns?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed to ownsClusterExtension "${NAME}" owns 1 ClusterObjectSet.

"""
Then ClusterExtension reports Progressing as True with Reason Retrying and Message includes:
"""
revision object collisions

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could we assert here the full message?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The full message includes the phase index and colliding object details (GVK, namespace/name with scenario IDs), e.g.:

revision object collisions in phase 0
ConfigMap.v1 ns-<id>/test-configmap-<id> ...

Asserting the full message would be brittle since the object names are scenario-specific. The existing collision test at line 274 uses the same Message includes approach with just the fragment. Happy to add a more specific fragment like "revision object collisions in phase" if that helps.

matchLabels:
"olm.operatorframework.io/metadata.name": ${CATALOG:test}
"""
Then ClusterExtension reports Progressing as True with Reason Retrying and Message includes:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given that we have applied in this tests two ClusterExtension it would be helpful here to distinguish visually which one reports the condition:

ClusterExtension "${NAME}-dup" reports Progressing as True with Reason Retrying and Message includes:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a comment above the assertion clarifying which CE is being checked: # The conflicting ClusterExtension (${NAME}-dup, now tracked as ${NAME}) should be retrying. The unnamed ClusterExtension reports steps use sc.clusterExtensionName which is the dup at that point, but that's not obvious to a reader.

A fully named variant like ClusterExtension "${NAME}-dup" reports ... with Reason ... and Message includes would require a new step definition that accepts name+type+status+reason+message — seemed like over-engineering for this one test.

revision object collisions
"""
# Verify the original ClusterExtension remains installed and unaffected
And ClusterExtension "ce-${SCENARIO_ID}" reports Installed as True

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be

ClusterExtension "${NAME}" reports Installed as True

because it is very internal detail that NAME has ce-${SCENARIO_ID} convention.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't use ${NAME} here — after the dup CE is applied, ResourceIsApplied overwrites sc.clusterExtensionName to the dup's name, so ${NAME} resolves to the dup (which is retrying, not installed). We need ce-${SCENARIO_ID} to reference the original CE.

${SCENARIO_ID} is a first-class template variable exposed by the framework, and the ce- prefix is established in CreateScenarioContext (hooks.go:218). The existing TrackCurrentClusterExtensionForCleanup pattern has the same constraint — once you apply a second CE, you lose the ${NAME} reference to the first one.

An alternative would be adding a new template variable (e.g. ${ORIGINAL_NAME}) that TrackCurrentClusterExtensionForCleanup populates, but that feels like over-engineering for one test.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't use ${NAME} here — after the dup CE is applied, ResourceIsApplied overwrites sc.clusterExtensionName to the dup's name, so ${NAME} resolves to the dup (which is retrying, not installed). We need ce-${SCENARIO_ID} to reference the original CE.

We should update ResourceIsApplied or some other e2e test logic so that we can have clearer step descriptions.

"""
Then ClusterExtension "${NAME}" has 2 ClusterObjectSets
# The higher-revision COS (revision 2) should also collide, not take over resources
And ClusterExtension reports Progressing as True with Reason Retrying and Message includes:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which cluster extension report that?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The conflicting ClusterExtension (the dup, tracked as ${NAME} after ResourceIsApplied). The comment on the line above clarifies this: "The higher-revision COS (revision 2) should also collide, not take over resources." Same pattern as the first collision assertion where I added a clarifying comment in the latest push.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The conflicting ClusterExtension (the dup, tracked as ${NAME} after ResourceIsApplied). The comment on the line above clarifies this: "The higher-revision COS (revision 2) should also collide, not take over resources." Same pattern as the first collision assertion where I added a clarifying comment in the latest push.

For reader it should be better if we could have ClusterExtension ${NAME}-dup ...

Comment thread test/e2e/features/update.feature Outdated

@BoxcutterRuntime
@DeploymentConfig
Scenario: A conflicting ClusterExtension with a higher revision does not take over resources from the original owner

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find the scenario title to describe a low-level implementation details - we should focus ourselves here on user visible change, something like "Cannot install further ClusterExtension referring already installed bundle".

Given that we are adding this test in the PR which is about upgrading boxcutter version, I am curious to understand if before this update we did not have such protection? If we did, then I would add this tests in a separate PR. Does boxcutter upgrade gives us this functionality automatically or we need to so something on our side to achieve it?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed to "Cannot install a ClusterExtension that refers to an already installed bundle".

On the scope question: cross-CE collision protection is existing boxcutter behavior — it was there before this PR. This PR changes the sibling owners API from WithSiblingOwners (all active revisions from the same CE) to WithPreviousOwners (only lower-revision ones). That's a same-CE handover concern, not cross-CE. The e2e test was added as a regression test to confirm that cross-CE collision protection still works correctly after the API change, but it's not testing new functionality. Happy to split it out into a separate PR if you prefer.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Happy to split it out into a separate PR if you prefer.

It would make sense to me... and to merge that first, before upgrading the boxcutter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 24, 2026 11:52
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@perdasilva perdasilva force-pushed the update-boxcutter-sibling-owners branch from e9e567f to a2d7a10 Compare June 24, 2026 11:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 4 comments.

Comment thread test/e2e/features/update.feature Outdated
Comment thread test/e2e/features/update.feature Outdated
Comment thread internal/operator-controller/controllers/revision_engine_factory.go
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 24, 2026 11:57
@perdasilva perdasilva changed the title 🌱 Update boxcutter integration for sibling owners API 🌱 Update boxcutter integration and add cross-CE collision regression test Jun 24, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants